/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siseventos.managed;

import br.siseventos.dao.util.HibernateUtil;
import br.siseventos.model.*;
import br.siseventos.service.EventoService;
import br.siseventos.service.ItemAvaliacaoService;
import br.siseventos.service.PublicoService;
import br.siseventos.service.TipoEventoService;
import br.siseventos.util.FileUploadHelper;
import br.siseventos.view.conversores.CustomScheduleModel;
import br.siseventos.view.util.MessageHelper;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;
import org.hibernate.Session;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.TabChangeEvent;
import org.primefaces.model.UploadedFile;

@ManagedBean(name = "eventoBean")
@ViewScoped
public class EventoBean extends BaseBean {

    // <editor-fold desc="Propriedades">
    private TbEvento evento = new TbEvento();
    private List<TdItemAvaliacao> itensAvaliacaoSelecionados = new ArrayList<TdItemAvaliacao>();
    private List<TbPublico> publicosSelecionados = new ArrayList<TbPublico>();
    private boolean novo = true;
    private boolean exibirFormNovo = false;
    private CustomScheduleModel customScheduleModel = new CustomScheduleModel();
    private UploadedFile file;
    private EventoService eventoService;
    private TipoEventoService tipoEventoService;
    private PublicoService publicoService;
    private ItemAvaliacaoService itemAvaliacaoService;
    private Session sessao;
    // </editor-fold>
    // <editor-fold desc="Construtor">
    // </editor-fold>
    // <editor-fold desc="Actionlisteners">

    public void onSalvar(ActionEvent event) {
        try {
            if (novo) {
                // Salvando o evento
                eventoService.incluir(evento);

                // Salvando a imagem do evento em uma pasta no servidor
                FileUploadHelper.saveImage(file, (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext());

                // Limpando o formulario de novo evento
                HibernateUtil.getSession().evict(evento); // Desligando o objeto da Session
                evento = new TbEvento();

                // Mostrando mensagem de erro
                MessageHelper.showGlobalMessage("Evento cadastrado com sucesso.", FacesMessage.SEVERITY_INFO);
            } else {

                // Mostrando mensagem de erro
                MessageHelper.showGlobalMessage("Evento atualizado com sucesso.", FacesMessage.SEVERITY_INFO);
            }
        } catch (Exception e) {
            // Mostrando mensagem de erro
            MessageHelper.showGlobalMessage("Ocorreu um erro na operação.", FacesMessage.SEVERITY_ERROR);
        }
    }

    public void onNovoEventoClick() {
        try {
            // Limpando o formulario
            //HibernateUtil.getSession().evict(evento);
            evento = new TbEvento();
            
            //itensAvaliacaoSelecionados = new ArrayList<TdItemAvaliacao>();
            //publicosSelecionados = new ArrayList<TbPublico>();
            // Setando o parametro de callback
            //CallbackHelper.addCallback("key", "novo");
        } catch (Exception e) {
            String x = e.getMessage();
        } finally {
            if (sessao != null) {
                sessao.close();
            }
        }
    }

    public void onEditarEventoClick() {

        try {
            // Buscando a lista de itens de avaliacao do evento
            //itensAvaliacaoSelecionados = ModelConverter.convertToItemAvaliacao(itemAvaliacaoService.consultar(evento));

            // Buscando a lista de publicos do evento
            //publicosSelecionados = ModelConverter.convertToPublico(publicoService.consultar(evento));

            // Atualizando o objeto para buscar os dados
            sessao = HibernateUtil.getSession();
            sessao.update(evento);

            // Setando o parametro de callback
            //CallbackHelper.addCallback("key", "editar");
        } catch (Exception e) {
        } finally {
            if (sessao != null) {
                sessao.close();
            }
        }
    }

    public void onTabChange(TabChangeEvent changeEvent) {
    }

    public void onFileUpload(FileUploadEvent event) {
        // Carregando o arquivo enviado
        file = event.getFile();

        // Setando a url da imagem do objeto evento
        String url = String.format("%s/%s", "store", file.getFileName());
        evento.setUrlImagemEvento(url);


    }
    // </editor-fold>
    // <editor-fold desc="Getters e Setters">

    public TbEvento getEvento() {
        return evento;
    }

    public void setEvento(TbEvento evento) {
        this.evento = evento;
    }

    public List<TdItemAvaliacao> getItensAvaliacaoSelecionados() {
        return itensAvaliacaoSelecionados;
    }

    public void setItensAvaliacaoSelecionados(List<TdItemAvaliacao> itensAvaliacaoSelecionados) {
        this.itensAvaliacaoSelecionados = itensAvaliacaoSelecionados;
    }

    public List<TbPublico> getPublicosSelecionados() {
        return publicosSelecionados;
    }

    public void setPublicosSelecionados(List<TbPublico> publicosSelecionados) {
        this.publicosSelecionados = publicosSelecionados;
    }

    public boolean isNovo() {
        return novo;
    }

    public void setNovo(boolean novo) {
        this.novo = novo;
    }

    public String getTituloJanela() {
        return (novo) ? "Novo evento" : "Editar evento";
    }

    public CustomScheduleModel getCustomScheduleModel() {
        return customScheduleModel;
    }

    public void setCustomScheduleModel(CustomScheduleModel customScheduleModel) {
        this.customScheduleModel = customScheduleModel;
    }

    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {
        this.file = file;
    }

    public boolean isExibirFormNovo() {
        return exibirFormNovo;
    }

    public void setExibirFormNovo(boolean exibirFormNovo) {
        this.exibirFormNovo = exibirFormNovo;
    }

    // </editor-fold>
    // <editor-fold desc="Static Getters">
    public List<TbEvento> getEventos() {
        List<TbEvento> eventos = null;
        try {
            eventos = getEventoService().consultarTodos();
        } catch (Exception e) {
        }
        return eventos;
    }

    public List<TbPublico> getPublicos() {
        List<TbPublico> publicos = null;
        try {
            publicos = getPublicoService().consultarTodos();
        } catch (Exception e) {
        }
        return publicos;
    }

    public List<TdItemAvaliacao> getItensAvaliacao() {
        List<TdItemAvaliacao> itens = null;
        try {
            itens = getItemAvaliacaoService().consultarTodos();
        } catch (Exception e) {
        }
        return itens;
    }

    public List<TdTipoEvento> getTiposEvento() {
        List<TdTipoEvento> tipos = null;
        try {
            tipos = getTipoEventoService().consultarTodos();
        } catch (Exception e) {
        }
        return tipos;
    }
    
    public String getUrlAtividade(){
        return "gerenciarAtividades.xhtml?ie=" + evento.getIdtEvento();
    }
    
    public String getUrlParticipante(){
        return "gerenciarParticipante.xhtml?ie=" + evento.getIdtEvento();
    }
    // </editor-fold>
    // <editor-fold desc="Service Getters">

    private EventoService getEventoService() {
        if (eventoService == null) {
            eventoService = new EventoService();
        }
        return eventoService;
    }

    private ItemAvaliacaoService getItemAvaliacaoService() {
        if (itemAvaliacaoService == null) {
            itemAvaliacaoService = new ItemAvaliacaoService();
        }
        return itemAvaliacaoService;
    }

    private PublicoService getPublicoService() {
        if (publicoService == null) {
            publicoService = new PublicoService();
        }
        return publicoService;
    }

    private TipoEventoService getTipoEventoService() {
        if (tipoEventoService == null) {
            tipoEventoService = new TipoEventoService();
        }
        return tipoEventoService;
    }
    // </editor-fold>
}
